#ifndef __GO_HELP_H__
#define __GO_HELP_H__


class help_introduce{
 /*
#0-编码规范
#1-语言帮助信息
#2-关键字智能提示
#3-库函数智能提示
#4-库函数说明
#5-关键字着色
*/ 
};


class help_keywords{
// 基本数据类型
// bool	    byte    int     uint   uintptr string
// int8	    int16	  int32   int64
// uint8    uint16  uint32  uint64
// complex	complex64	complex128
// float32	float64	
// 复合数据类型  
// struct
// 常量
// const	true  false nil
// 流程
// if    else	
// switch  case break  default 
// for continue goto return

// func	
// interface	
// select
// defer	
// go	
// map	
// chan			
// package	
// fallthrough		
// range	
// type
// import	
// var

// 内建函数
// len
// cap
// append
// print
// println

// close
// copy
// imag
// real
	
// iota		make	new		panic	
// recover			


}；

class help_types{
  // 基础数据类型
  // bool 常量 true 或者 false。一个简单的例子：var b bool = true
  // uint8  无符号 8 位整型 (0 到 255)
  // uint16 无符号 16  位整型 (0 到 65535)
  // uint32 无符号 32 位整型 (0 到 4294967295)
  // uint64 无符号 64 位整型 (0 到 18446744073709551615)
  // int8   有符号 8 位整型 (-128 到 127)
  // int16  有符号 16 位整型 (-32768 到 32767)
  // int32  有符号 32 位整型 (-2147483648 到 2147483647)
  // int64  有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

  // float32     IEEE-754 32位浮点型数
  // float64     IEEE-754 64位浮点型数
  // complex64   32 位实数和虚数
  // complex128  64 位实数和虚数
  // 基于架构的类型，例如：
  // int      32 或 64 位
  // uint     32 或 64 位
  // uintptr 无符号整型，用于存放一个指针

  // (a) 指针类型（Pointer）
  // (b) 数组类型
  // (c) 结构化类型(struct)
  // (d) Channel 类型
  // (e) 函数类型
  // (f) 切片类型
  // (g) 接口类型（interface）
  // (h) Map 类型


};

/******************************************************************************************
 2.0  类型和值
******************************************************************************************/
/*
--------------------------------------------------------------------
#变量     描述                 例子
--------------------------------------------------------------------
$0           The filename of the current script.
$n           These variables correspond to the arguments with which a script was invoked.
             Here n is a positive decimal number corresponding to the position of an argument
             (the first argument is $1, the second argument is $2, and so on).
$#           The number of arguments supplied to a script.
$*           All the arguments are double quoted. If a script receives two arguments,
             $* is equivalent to $1 $2.
$@           All the arguments are individually double quoted.
             If a script receives two arguments, $@ is equivalent to $1 $2.
$?           The exit status of the last command executed.
$$           The process number of the current shell. For shell scripts,
             this is the process ID under which they are executing.
$!           The process number of the last background command.

--------------------------------------------------------------------
#数组        描述                       例子
--------------------------------------------------------------------
array_var[index]= value        (index = 0 ..)
array_name=(value_1 .. value_n)
${array_name[*]}                访问所有元素
${array_name[@]}                访问所有元素

fruits=(
'apple red'
'orange green'
)
for line in ${fruits[*]}
do
	echo $line
	for b in $line
	do
	echo $b
	done
done

算术运算符(假设变量a=10,变量b=20)
--------------------------------------------------------------------
#运算符      描述                       例子
--------------------------------------------------------------------
+            加法                       `expr $a + $b` will give 30
-            减法                       `expr $a - $b` will give -10
*            乘法                       `expr $a * $b` will give 200
/            除法                       `expr $b / $a` will give 2
%            模(取余)                    `expr $b % $a` will give 0
=            赋值                        a=$b would assign value of b into a
==           等于                        [ $a == $b ] would return false.
!=           不等于                      [ $a != $b ] would return true.


#关系运算符(假设变量a=10,变量b=20)
--------------------------------------------------------------------
运算符       描述                        示例
--------------------------------------------------------------------
-eq          比较两个变量相等            [ $a -eq $b ] is not true.
-ne          比较两个变量不相等          [ $a -ne $b ] is true.
-gt          大于                        [ $a -gt $b ] is not true.
-lt          小于                        [ $a -lt $b ] is true.
-ge          大于等于                    [ $a -ge $b ] is not true.
-le          小于等于                    [ $a -le $b ] is true.

#布尔运算符
--------------------------------------------------------------------
运算符       描述                       示例
--------------------------------------------------------------------
!            逻辑非                      [ ! false ] is true.
-o           逻辑或                      [ $a -lt 20 -o $b -gt 100 ] is true.
-a           逻辑与                      [ $a -lt 20 -a $b -gt 100 ] is fa


#字符串运算符(假设变量a="abc" 和变量b="efg"
--------------------------------------------------------------------
运算符       描述                        示例
--------------------------------------------------------------------
=            字符串是否相等              [ $a = $b ] is not true.
!=           字符串是否不相等            [ $a != $b ] is true.
-z           字符串长度是否为0           [ -z $a ] is false.
-n           字符串长度是否非0           [ -n $a ] true
str          字符串为非空                [ $a ] is not false.


#文件测试操作
--------------------------------------------------------------------
操作符       描述                        示例
--------------------------------------------------------------------
-b           文件是否为块设备文件        [ -b $file ] is false.
-c           文件是否为字符设备文件      [ -b $file ] is false.
-d           文件是否为目录              [ -d $file ] is not true.
-f           文件是否为一个普通文件      [ -f $file ] is true.
-g           文件是否设置SGID标志        [ -g $file ] is false.
-k           文件是否设置sticky标志      [ -k $file ] is false.
-p           文件是否为命名管道文件      [ -p $file ] is false.
-t           文件是否是否和终端关联      [ -t $file ] is false.
-u           文件是否设置SUID标志        [ -u $file ] is false.
-r           文件是否可读                [ -r $file ] is true.
-w           文件是否可写                [ -w $file ] is true.
-x           文件是否可执行              [ -x $file ] is true.
-s           文件size是否大于0           [ -s $file ] is true.
-e           文件是否存在                [ -e $file ] is true.

字符串操作
--------------------------------------------------------------------
操作            范例
--------------------------------------------------------------------
## 1. 取长度
str="abcd"
expr length $str   # 4
echo ${#str}       # 4
expr "$str" : ".*" # 4
好像一般使用第二种

## 2. 查找子串的位置
str="abc"
expr index $str "a"  # 1
expr index $str "b"  # 2
expr index $str "x"  # 0
expr index $str ""   # 0

## 3. 选取子串
str="abcdef"
expr substr "$str" 1 3  # 从第一个位置开始取3个字符， abc
expr substr "$str" 2 5  # 从第二个位置开始取5个字符， bcdef 
expr substr "$str" 4 5  # 从第四个位置开始取5个字符， def
echo ${str:2}           # 从第二个位置开始提取字符串， bcdef
echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd
echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde
echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde
 

## 4. 截取子串 
str="abbc,def,ghi,abcjkl"
echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉）
echo ${str##a*c}    # 输出jkl，             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"}   # 输出abbc,def,ghi,abcjkl 因为str中没有"a*c"子串
echo ${str##"a*c"}  # 输出abbc,def,ghi,abcjkl 同理
echo ${str#*a*c*}   # 空
echo ${str##*a*c*}  # 空
echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl, 
echo ${str#*d*f}    # 输出,ghi,abcjkl   
echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配 
echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配
echo ${str%a*c}     # abbc,def,ghi,abcjkl
可以这样记忆, 井号（#）通常用于表示一个数字，它是放在前面的；百分号（%）卸载数字的后面; 或者这样记忆，在键盘布局中，井号(#)总是位于百分号（%）的左边(即前面)    :-)

## 5. 字符串替换 
str="apple, tree, apple tree"
echo ${str/apple/APPLE}   # 替换第一次出现的apple
echo ${str//apple/APPLE}  # 替换所有apple
echo ${str/#apple/APPLE}  # 如果字符串str以apple开头，则用APPLE替换它
echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾，则用APPLE替换它
 

## 6. 比较
[[ "a.txt" == a* ]]        # 逻辑真 (pattern matching)
[[ "a.txt" =~ .*\.txt ]]   # 逻辑真 (regex matching)
[[ "abc" == "abc" ]]       # 逻辑真 (string comparision) 
[[ "11" < "2" ]]           # 逻辑真 (string comparision), 按ascii值比较
 
## 7. 连接 
s1="hello"
s2="world"
echo ${s1}${s2}   # 当然这样写 $s1$s2 也行，但最好加上大括号



重定向命令：
--------------------------------------------------------------------
命令            描述
--------------------------------------------------------------------
pgm > file      Output of pgm is redirected to file
pgm < file      Program pgm reads its input from file.
pgm >> file     Output of pgm is appended to file.
n > file        Output from stream with descriptor n redirected to file.
n >> file       Output from stream with descriptor n appended to file.
n >& m          Merge output from stream n with stream m.
n <& m          Merge input from stream n with stream m.
<< tag          Standard input comes from here through next tag at start of line.
|               Takes output from one program, or process, and sends it to another.

#需要注意的是文件描述符
0 是正常标准输入（STDIN），
1 是标准输出（STDOUT），
2 标准错误输出（STDERR）。

#输出重定向
command>file       重定向到新的文件
command>>file      重定向追加到现有的文件

Here 文档
command << delimiter
document
delimiter
#丢弃输出
command > /dev/null


command < filename                  把标准输入重定向到filename文件中
command 0< filename                 把标准输入重定向到filename文件中

command > filename                  把标准输出重定向到filename文件中(覆盖)
command 1> fielname                 把标准输出重定向到filename文件中(覆盖)

command >> filename                 把标准输出重定向到filename文件中(追加)
command 1>> filename                把标准输出重定向到filename文件中(追加)

command 2> filename                 把标准错误重定向到filename文件中(覆盖)
command 2>> filename                把标准输出重定向到filename文件中(追加)

command > filename 2>&1             把标准输出和标准错误一起重定向到filename文件中(覆盖)
command >> filename 2>&1            把标准输出和标准错误一起重定向到filename文件中(追加)

command < filename >filename2       把标准输入重定向到filename文件中，把标准输出重定向

                                                        到filename2文件中
command 0< filename 1> filename2    把标准输入重定向到filename文件中，把标准输出重定向

                                                        到filename2文件中


控制语句
--------------------------------------------------------------------
命令            描述
--------------------------------------------------------------------
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while(( $int<=5 ))
do
    echo $int
    let "int++"
done


for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done


case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

#函数
function_name () {
   list of commands
}


正则表达式
--------------------------------------------------------------------
命令            描述
--------------------------------------------------------------------

FAQ：
 bash 返回值，一般为数字 exit xxx;
 bash 返回字符串 echo "hello"
 bash 运行命令返回值为 127 表示命令没有安装

*/


/*

Sample

#!/bin/bash

# Author : Zara Ali
# Copyright (c) Tutorialsyiibai.com
# Script follows here:
pstree -p

列出进程打开的文件或者资源
lsof -p {sh 的子进程 pid}

*/

#endif